package com.example.demo.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * 执行顺序：
 * 1.LogAop（日志）
 *
 * 9.LimitAop（接口防刷）
 * 10.RepeatAop（防重复提交）
 *
 * 100.SecurityAop（token校验）
 * 101.PermissionAop（用户身份权限）
 * 102.SignAop（接口加签发送）
 * 103.IdempotentAop（幂等性、加锁）
 *
 * 1000.AtomizationAop（事务）
 * 1001.TimeoutAop（接口超时）
 */
@Aspect
@Component
public class AopAdvice {
    @Pointcut("execution(int com.example.demo.controller.*.*(..))")
    //@Pointcut("execution(public * com.example.demo.controller.*.*(..))")
    public void AopAdvice() { }

    @Before("AopAdvice()")
    public void before(JoinPoint joinPoint) {
        /*System.out.println(joinPoint.getSignature().getName());
        System.out.println(joinPoint.getArgs());*/
        System.out.println("before...");
    }

    @After("AopAdvice()")
    public void after(JoinPoint joinPoint) {
        System.out.println("after...");
    }

    @Around("AopAdvice()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("before Of around...");

        Object obj = joinPoint.proceed();

        System.out.println("after Of around...");

        return obj;
    }

    @AfterReturning(pointcut = "AopAdvice()", returning = "result")
    public void afterReturning(JoinPoint joinPoint, Object result) {
        System.out.println("返回值：" + result);
    }
}
